//Copyright 2012-2019 Keysight Technologies // //Licensed under the Apache License, Version 2.0 (the "License"); //you may not use this file except in compliance with the License. //You may obtain a copy of the License at // //http://www.apache.org/licenses/LICENSE-2.0 // //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. using System.Collections; using System.Collections.Generic; using System.Linq; using OpenTap; namespace PluginDevelopment.Advanced_Examples { // This examples shows how to do some of the same things as ComplexSettingsExample1, // but with Annotations instead of modifying the original data structure. public class ComplexSettingsElement2 { public int A { get; set; } public int B { get; set; } } [Display("Complex Settings DUT2", "Demonstrates how to use Annotations to handle complex data.", Groups: new[] { "Examples", "Plugin Development", "Advanced Examples" })] public class ComplexSettingsExample2 : Dut { public List AvailableValuesForElements { get; set; } = new List() {1, 2, 3}; public List ListOfElements { get; set; } = new List{}; public void OnElementWrite(ComplexSettingsElement2 elem) { Log.Debug("Element written {0}", ListOfElements.IndexOf(elem)); } public void OnListWrite(List value) { Log.Debug("List written"); } } public class ComplexSettingsAnnotator : IAnnotator { class AvailableIntsAnnotation : IAvailableValuesAnnotation, IOwnedAnnotation { AnnotationCollection annotation; public IEnumerable AvailableValues { get { var dut = annotation.ParentAnnotation?.ParentAnnotation?.Source as ComplexSettingsExample2; if (dut != null) return dut.AvailableValuesForElements; return Enumerable.Empty(); } } public AvailableIntsAnnotation(AnnotationCollection annotation) => this.annotation = annotation; public void Read(object source) { } // we dont need Read. public void Write(object source) { var dut = annotation.ParentAnnotation?.ParentAnnotation?.Source as ComplexSettingsExample2; var elem = (ComplexSettingsElement2) annotation.Source; dut.OnElementWrite(elem); } } class ListValueChanged : IOwnedAnnotation { AnnotationCollection annotation; public ListValueChanged(AnnotationCollection annotation) => this.annotation = annotation; public void Read(object source) { } // we dont need Read. public void Write(object source) { var v = annotation.Get(false, this).Value; var dut = annotation.Source as ComplexSettingsExample2; dut.OnListWrite((List)v); } } IMemberData listmember = TypeData.FromType(typeof(ComplexSettingsExample2)) .GetMember(nameof(ComplexSettingsExample2.ListOfElements)); public void Annotate(AnnotationCollection annotations) { if (Equals(annotations.Get()?.Member, listmember)) { annotations.Add(new ListValueChanged(annotations)); return; } var type = annotations.Get().ReflectionInfo; if (type.DescendsTo(typeof(int)) == false) return; var listAnnotation = annotations.ParentAnnotation; var listType = listAnnotation?.Get().ReflectionInfo; if (listType == null) return; var dutAnnotation = listAnnotation.ParentAnnotation; var listElem = dutAnnotation?.Get(); if (listElem?.Member == listmember) { annotations.Add(new AvailableIntsAnnotation(annotations)); } } public double Priority => 5; } }